home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / etc / RCS / frexp.c,v < prev    next >
Text File  |  1992-03-27  |  3KB  |  173 lines

  1. head     1.3;
  2. branch   ;
  3. access   ;
  4. symbols  ;
  5. locks    ; strict;
  6. comment  @ * @;
  7.  
  8.  
  9. 1.3
  10. date     92.03.27.13.37.07;  author rab;  state Exp;
  11. branches ;
  12. next     1.2;
  13.  
  14. 1.2
  15. date     90.09.11.14.18.33;  author kupfer;  state Exp;
  16. branches ;
  17. next     1.1;
  18.  
  19. 1.1
  20. date     90.09.06.16.08.42;  author kupfer;  state Exp;
  21. branches ;
  22. next     ;
  23.  
  24.  
  25. desc
  26. @frexp math routine: express the argument as a multiplier and a power of
  27. two.
  28. @
  29.  
  30.  
  31. 1.3
  32. log
  33. @Fixed some lint errors.
  34. @
  35. text
  36. @/* 
  37.  * frexp.c --
  38.  *
  39.  *    frexp math routine..
  40.  *
  41.  */
  42.  
  43. #ifndef lint
  44. static char rcsid[] = "$Header: /sprite/src/lib/c/etc/RCS/frexp.c,v 1.2 90/09/11 14:18:33 kupfer Exp Locker: rab $ SPRITE (Berkeley)";
  45. #endif /* not lint */
  46.  
  47. #include <math.h>
  48.  
  49. /* 
  50.  * math.h provides inline definitions for using the 68881 coprocessor 
  51.  * on a sun3.  frexp is one of the functions that gets inlined.
  52.  */
  53.  
  54. #if defined(__STDC__) && defined(sun3) && !defined(__STRICT_ANSI__) \
  55.   && !defined(__SOFT_FLOAT__)
  56.  
  57. /* use the inline definition */
  58.  
  59. #else
  60.  
  61.  
  62. /*
  63.  *----------------------------------------------------------------------
  64.  *
  65.  * frexp --
  66.  *
  67.  *    Describe the given argument as two numbers, x and i, where 
  68.  *    arg = x * (2**i).
  69.  *
  70.  * Results:
  71.  *    Returns the multiplier "x", which is always less than 1.0 in 
  72.  *    absolute value.
  73.  *
  74.  * Side effects:
  75.  *    Stores the integer exponent "i" at the address pointed to.
  76.  *
  77.  *----------------------------------------------------------------------
  78.  */
  79.  
  80. double
  81. frexp(x, i)
  82.     double x;
  83.     int *i;
  84. {
  85.     int neg, j;
  86.  
  87.     j = 0;
  88.     neg = 0;
  89.     if (x < 0) {
  90.     x = -x;
  91.     neg = 1;
  92.     }
  93.     if (x > 1.0) {
  94.     while (x > 1) {
  95.         ++j;
  96.         x /= 2;
  97.     }
  98.     } else if (x < 0.5) {
  99.     while(x < 0.5) {
  100.         --j;
  101.         x *= 2;
  102.     }
  103.     }
  104.     *i = j;
  105.     return neg ? -x : x;
  106. }
  107.  
  108. #endif /* inline test */
  109. @
  110.  
  111.  
  112. 1.2
  113. log
  114. @Fix comments, add rcsid. Don't compile if using coprocessor.
  115. @
  116. text
  117. @d9 1
  118. a9 1
  119. static char rcsid[] = "$Header: /sprite/lib/forms/RCS/proto.c,v 1.3 90/01/12 12:03:36 douglis Exp $ SPRITE (Berkeley)";
  120. d44 1
  121. a44 1
  122.     
  123. d47 2
  124. a48 2
  125.         double x;
  126.         int *i;
  127. d50 1
  128. a50 1
  129.         int neg, j;
  130. d52 19
  131. a70 20
  132.         j = 0;
  133.         neg = 0;
  134.         if (x<0) {
  135.                 x = -x;
  136.                 neg = 1;
  137.         }
  138.         if (x>1.0)
  139.                 while (x>1) {
  140.                         j = j+1;
  141.                         x = x/2;
  142.                 }
  143.         else if (x<0.5)
  144.                 while(x<0.5) {
  145.                         j = j-1;
  146.                         x = 2*x;
  147.                 }
  148.         *i = j;
  149.         if(neg)
  150.                 x = -x;
  151.         return (x);
  152. @
  153.  
  154.  
  155. 1.1
  156. log
  157. @Initial revision
  158. @
  159. text
  160. @d1 17
  161. d19 8
  162. d28 15
  163. a42 6
  164.  * the call
  165.  *      x = frexp(arg,&exp);
  166.  * must return a double fp quantity x which is <1.0
  167.  * and the corresponding binary exponent "exp".
  168.  * such that
  169.  *      arg = x*2^exp
  170. d44 1
  171. d73 2
  172. @
  173.